package cn.itcast.web.controller.cargo;

import cn.itcast.common.utils.BeanMapUtils;
import cn.itcast.common.utils.DownloadUtil;
import cn.itcast.domain.cargo.Export;
import cn.itcast.domain.cargo.ExportProduct;
import cn.itcast.domain.cargo.ExportProductExample;
import cn.itcast.domain.system.User;
import cn.itcast.service.cargo.ExportProductService;
import cn.itcast.service.cargo.ExportService;
import cn.itcast.web.controller.BaseController;
import com.alibaba.dubbo.config.annotation.Reference;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 练习jasper生成pdf文件
 */
@Controller
@RequestMapping("/cargo/export")
public class PdfController extends BaseController {

	@Reference
	private ExportService exportService; //报运单service

	@Reference
	private ExportProductService exportProductService; //报运单service

	/**
	 * 报运单PDF文件下载
	 *  参数：id（报运单id）
	 *  业务：
	 *      - 根据id查询报运单对象
	 *      - 根据报运单id查询报运单商品
	 *      - 将报运单对象转化为map集合
	 *      - 通过jasper加载模板，导出模板
	 */
	@RequestMapping("/exportPdf")
	public void exportPdf(String id) throws Exception {
		//根据id查询报运单对象
		Export export = exportService.findById(id);
		//根据报运单id查询报运单商品
		ExportProductExample example = new ExportProductExample();
		ExportProductExample.Criteria criteria = example.createCriteria();
		criteria.andExportIdEqualTo(id);
		List<ExportProduct> list = exportProductService.findAll(example);

		for (ExportProduct ep: list) {
			System.out.println(ep.getProductNo());
		}
		//将报运单对象转化为map集合
		Map<String, Object> map = BeanMapUtils.beanToMap(export);
		//获取模板路径
		String path = session.getServletContext().getRealPath("/")+"/jasper/export.jasper";
		//加载模板，数据填充
		JasperPrint print = JasperFillManager.fillReport(path, map, new JRBeanCollectionDataSource(list));
		//预览pdf
		//JasperExportManager.exportReportToPdfStream(print,response.getOutputStream());


		byte[] bytes = JasperExportManager.exportReportToPdf(print); //获取到pdf文件的byte数组

		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); //创建ByteArrayOutputStream输出流
//        把pdf字节数组写入到缓存流中
		byteArrayOutputStream.write(bytes);

		new DownloadUtil().download(byteArrayOutputStream,response,"报运单.pdf");
	}


	/**
	 * 03：数据源（list集合）类型的数据填充
	 *  模板中：可以接受一个List<User> list 的数据
	 */
//	@RequestMapping("/exportPdf")
//	public void exportPdf() throws Exception {
//		//1.获取模板路径
//		String path = session.getServletContext().getRealPath("/")+"/jasper/test04.jasper";
//		//2.加载模板，填充数据
//		List list = new ArrayList();
//		for(int i=0;i<10;i++) {
//			User user = new User();
//			user.setUserName("用户"+i);
//			user.setEmail(i+"@itcast.cn");
//			user.setDeptName("部门"+i);
//			user.setCompanyName("企业"+i);
//			list.add(user);
//		}
//		JRDataSource dataSource = new JRBeanCollectionDataSource(list); //存放list对象集合的数据源
//		JasperPrint jasperPrint = JasperFillManager.fillReport(path, new HashMap(), dataSource);
//		//3.pdf文件导出
//		JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
//	}


	/**
	 * 02: map类型的数据填充
	 */
//	@RequestMapping("/exportPdf")
//	public void exportPdf() throws Exception {
//		//1.获取模板路径
//		String path = session.getServletContext().getRealPath("/")+"/jasper/test03.jasper";
//		//2.加载模板，填充数据
//		Map map = new HashMap<>();
//		map.put("username","张三");
//		map.put("email","abc@itcast.cn");
//		map.put("age",12);
//		map.put("companyName","传智播客");
//		JasperPrint jasperPrint = JasperFillManager.fillReport(path, map, new JREmptyDataSource());
//		//3.导出模板
//		JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
//	}

	/**
	 *
	 * 01 用户点击此链接，照展示PDF的入门案例
	 *      pdf文件的导出（下载或者预览）
	 */
//	@RequestMapping("/exportPdf")
//	public void exportPdf() throws Exception {
//		//1.加载pdf模板
//		String path = session.getServletContext().getRealPath("/")+"/jasper/test02.jasper";
//		//2.加载模板，数据填充（数据是空）
//		/**
//		 * 模板路径
//		 * map类型参数
//		 * list集合参数 : 数据源
//		 */
//		JasperPrint jasperPrint = JasperFillManager.fillReport(path, new HashMap<>(), new JREmptyDataSource());
//		//3.pdf文件导出(预览)
//		JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream()); //jasperPrint，response中的outputstream
//	}
}
